package com.itheima.d4_enum;

/**
 * 枚举是一种特殊类。
 * 枚举类的格式：
 * 修饰符 enum 枚举类名{
 * 名称1 ,  名称2, ... ;
 *        其他成员…
 *        }
 * 注意：
 * 枚举类中的第一行，只能写一些合法的标识符(名称)，多个名称用逗号隔开。
 * 这些名称，本质是常量，每个常量都会记住枚举类的一个对象。
 *
 */

/**
 * 枚举类的第一行只能罗列一些名称，这些名称都是常量，并且每个常量记住的都是枚举类的一个对象。
 * 枚举类的构造器都是私有的（写不写都只能是私有的），因此，枚举类对外不能创建对象。
 * 枚举都是最终类，不可以被继承。
 * 枚举类中，从第二行开始，可以定义类的其他各种成员。
 * 虽然枚举类中可以像类一样，写一些类的其他成员，但是一般不会这么写，如果你真要这么干的话，到不如直接写普通类来的直接。
 * 编译器为枚举类新增了几个方法，并且枚举类都是继承：java.lang.Enum类的，从enum类也会继承到一些方法。
 *
 * 我们会看到，枚举类A是用class定义的，说明枚举确实是一个类，而且X，Y，Z都是A类的对象；
 * 而且每一个枚举项都是被`public static final `修饰，所以被可以类名调用，而且不能更改。
 */

/**
 * 刚才说，枚举项实际上是枚举类的对象，这一点其实可以通过反编译的形式来验证
 * （需要用到反编译的命令，这里不能直接将字节码拖进idea反编译），用的是命令行窗口的javap命令
 * 编译结果：
 *  public static final com.itheima.d4_enum.A X;
 *   public static final com.itheima.d4_enum.A Y;
 *   public static final com.itheima.d4_enum.A Z;
 *   public static com.itheima.d4_enum.A[] values();
 *   public static com.itheima.d4_enum.A valueOf(java.lang.String);
 *   public java.lang.String getName();
 *   public void setName(java.lang.String);
 *   static {};
 *   所以会发现前三个枚举项都是（com.itheima.d4_enum.A）类型的常量
 *
 *   Compiled from “A.java"
 *   public final class A extends java.lang.Enum<A> {
 *   public static final A X = new A();
 *   public static final A Y = new A();
 *   public static final A Z = new A();
 *   public static A[] values();
 *   public static A valueOf(java.lang.String);
 *   }
 */
public enum A  {    //编译后的样子：public final class A extends java.lang.Enum<A> 枚举都是最终类，不可以被继承
    // 常量，每个常量都是记住枚举类的一个对象的。举例：public static final A X=new A();
    X,Y,Z("张三"); //三个枚举项。枚举项后面加括号，就是在执行枚举类的带参数构造方法。


    //枚举类的构造器都是私有的（写不写都只能是私有的），因此，枚举类对外不能创建对象。
    A(){   //无参构造器
    }

    A(String name){   //有参构造器
    }

    //成员变量
    private String name;

    //成员方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
